public class code1 {
    // 牛客 top 101 判断平衡二叉树

    // 判断平衡二叉树的判断条件是，左右子树的值相差不能超过 1

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return bool布尔型
     */
    public boolean IsBalanced_Solution (TreeNode pRoot) {
        // write code here
        // 先来判断树为 null 的情况
        if(pRoot == null) {
            return true;
        }
        // 要解决这里的这个问题，与获取树的最大深度是相同的。
        // 可以通过先序遍历的形式来操作
        int re = TheBalence(pRoot);
        if (re < 0) {
            return false;
        }
        return true;
    }

    private static int TheBalence(TreeNode root) {
        if(root == null) {
            return 0;
        }
        // 先来进行左子树的判断
        int left = TheBalence(root.left);
        // 这里将 -1 作为一个非平衡的判断条件
        if(left == -1) {
            return -1;
        }
        int right = TheBalence(root.right);
        if(right == -1) {
            return -1;
        }
        // 这里通过相同高度的节点相减来判断是否平衡
        if(Math.abs(left-right) > 1) {
            return -1;
        }

        // 这里返回的是将每一层的层数 + 1，如果平衡，相同高度的到的数据应该是相同的
        // 也就是说返回时左右子树相减的到的数为 0
        return Math.max(left,right) + 1;
    }
}
